package com.bbb.common;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
//@AllArgsConstructor
public class Result<U> {
    // code状态码
    private Integer code;
    // msg信息提示
    private String msg;
    // data数据
    private Object data;
    // 新增字段用于存储JWT令牌
    private String token;

    // 成功且无数据返回的构造方法
    public Result(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
        this.data = null;
        this.token = null;
    }

    // 成功且有数据返回的构造方法
    public Result(Integer code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
        this.token = null;
    }

    // 成功且有数据和token返回的构造方法
    public Result(Integer code, String msg, Object data, String token) {
        this.code = code;
        this.msg = msg;
        this.data = data;
        this.token = token;
    }

    // 失败的构造方法
    public Result(Integer code, String msg, String token) {
        this.code = code;
        this.msg = msg;
        this.data = null;
        this.token = token;
    }

    // 快速创建成功且无数据返回的Result对象的静态方法
    public static <U> Result<U> success(String msg) {
        return new Result<>(Code.GET_OK, msg);
    }

    // 快速创建成功且有数据返回的Result对象的静态方法
    public static <U> Result<U> success(String msg, U data) {
        return new Result<>(Code.GET_OK, msg, data);
    }

    // 快速创建成功且有数据和token返回的Result对象的静态方法
    public static <U> Result<U> success(String msg, U data, String token) {
        return new Result<>(Code.GET_OK, msg, data, token);
    }

    // 快速创建失败的Result对象的静态方法
    public static <U> Result<U> fail(Integer code, String msg) {
        return new Result<>(code, msg);
    }

    // 快速创建失败且有token返回的Result对象的静态方法
    public static <U> Result<U> fail(Integer code, String msg, String token) {
        return new Result<>(code, msg, token);
    }
}